<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>简易仓储系统-对象数组</title>
  <script>
    //*****************核心：1. 货物数组 的增删改查**************************
    let arrStuff = [{
      sName: '苹果',
      sNum: 100
    },
    {
      sName: '香蕉',
      sNum: 100
    },
    {
      sName: '哈士奇',
      sNum: 100
    },
    {
      sName: '金毛',
      sNum: 100
    },
    ];
    //*******************************************************************

    //0.1 获取 用户输入不为空的数据
    function getInput(msg) {
      // 第一次接收用户输入
      var res = prompt('系统提示：' + msg);
      // 如果输入为空，则重新输入，直到输入不为空 为止
      while (res == '') {
        res = prompt('系统提示：输入不能为空，' + msg);
      }
      // 返回 用户输入的 内容
      return res;
    }

    //0.3 获取用户的操作选项 方法 ---------------------------------
    //    返回值：返回 操作提示 字符串
    function getOperator() {
      let strMsg = '欢迎使用简易仓储系统~~！\n';
      strMsg += '请选择您要进行的操作：\n';
      strMsg += '1.新增货物\n2.追加货物数量\n3.取出货物\n4.移除货物\n5.查看货物清单\n6.退出';
      // 获取并返回 用户选择的 数字
      return getInput(strMsg);
    }


    //0.2 启动函数，开始执行仓库业务
    function main() {
      let doWhile = true;
      //开始循环 与 用户交互操作
      while (doWhile) {
        // 获取用户的操作选项 -----------------------
        let usrOperator = getOperator();
        // 根据用户选项 进行不同操作------------------
        switch (usrOperator) {
          case '1': {// 新增货物种类
            addProduct();
            break;
          }
          case '2': {// 追加货物数量-------
            // 追加 数组中 对应 货物 的库存数量
            addNumber();
            break;
          }
          case '3': {// 取出货物------------
            // 减少 数组中 对应 数组的库存数量
            pickPro();
            break;
          }
          case '4': {//移除货物------------
            removePro();
            break;
          }
          case '5': {// 查看货物清单--------
            let strMsg = getProListStr('现有商品清单：\n');
            alert(strMsg);
            break;
          }
          case '6': {// 退出----------------
            doWhile = false;
            alert('谢谢光临，欢迎再来~~~！');
            break;
          }
        }
      }
    }

    // 开始执行业务代码
    main();


    // 1.新增货物种类----------------------------------------------
    function addProduct() {
      // a.获取 新货物名称 和 数量
      let newName = getInput('请输入要新增货物的 名称：');
      let newNum = +getInput('请输入新增货物的 初始数量：');
      // b.向数组中 添加 一种 货物
      arrStuff.push({
        sName: newName,//'金毛',
        sNum: newNum //100
      });
      // c.显示商品列表
      alert(getProListStr('【增加成功】\n现有商品清单：\n'));
    }

    // 2. 添加某件货物数量 ----------------------------------------
    function addNumber() {
      // a.获取用户要操作的货物名称 index
      let sIndex = getUsrChooseProIndex();

      // b.获取用户要追加的数量
      let sNumber = parseInt(prompt('请选择您要追加的【数量】：'));

      // c.从 货物名称数组中 获取 对应 下标的 货物名称
      let proName = arrStuff[sIndex].sName;

      // d.把 数量 追加到 货物数量数组 对应 下标的 货物库存量 中
      arrStuff[sIndex].sNum += sNumber;

      // e.新增【货物名称】共【100】个成功，库存：货物数量数组[sIndex]
      alert('新增【' + proName + '】共 【' + sNumber + '】个成功，库存：' + arrStuff[sIndex].sNum);
    }

    // 3. 减少某件货物数量 ------------------------------------------
    function pickPro() {
      // a.获取用户要取出货物的 index(下标)
      let sIndex = getUsrChooseProIndex();
      // b.获取用户要取出的数量
      let sNumber = parseInt(prompt('请选择您要取出的【数量】：'));
      // c.获取 要取出货物 的 库存数量
      let targetNum = arrStuff[sIndex].sNum;
      // d.获取 要取出货物 的 名称
      let proName = arrStuff[sIndex].sName;

      // e.如果 要取出的货物数量 < 该货物库存数量，则 库存 - 要取出的数量
      if (targetNum >= sNumber) {
        // f.将 货物数量数组 里 该货物的 库存 修改
        arrStuff[sIndex].sNum -= sNumber;
        // g.取出【货物名称】共【100】个成功，库存：货物数量数组[sIndex]
        alert('取出【' + proName + '】共 【' + sNumber + '】个成功，库存：' + arrStuff[sIndex].sNum);
      } else {
        alert('对不起，库存不够~~！');
      }
    }

    // 4. 移除货物种类 -----------------------------------------------
    function removePro() {
      // 获取用户要移除货物的 index(下标)
      let proIndex = getUsrChooseProIndex();
      // 删除 数组中 对应下标的 货物
      arrStuff.splice(proIndex, 1);
      // 显示商品列表
      alert(getProListStr('【移除成功】\n现有商品清单：\n'));
    }

    // 5. 获取用户要操作的货物名称 --------------------------------------
    //   返回值：返回 货物清单 和 提示用户选择的字符串。
    function getUsrChooseProIndex() {
      // 生成 货物 列表字符串
      let proNo = getProListStr('请选择您要操作的【货物序号】：\n');
      //接收并返回 用户 选择 货物 对应的 下标
      return getInput(proNo);
    }

    // 6.获取货物清单（名称和数量）---------------------------------------
    //  返回值：货物清单字符串
    function getProListStr(msg) {
      // 如果 有前置消息，则 设置给变量；如果没有，则设置变量默认为空。
      let strHouseInfo = msg ? msg : '';
      for (let i = 0; i < arrStuff.length; i++) {
        /* 组成字符串： 
            1.苹果 的数量为：101 \n
            2.香蕉 的数量为：10 \n
          */
        strHouseInfo += i + '.' + arrStuff[i].sName + ' 的数量为：' + arrStuff[i].sNum + '\n';
      }
      return strHouseInfo;
    }



    //根据 货物名称 找到 货物名称 在数组里的 下标 ( 货物名称 )
      // 返回值：返回 货物 在 货物名称数组中 对应的下标
    // function getIndexByName(proName) {
    //   let targetIndex = -1;
    //   for (let i = 0; i < arrStuff.length; i++) {
    //     if (arrStuff[i].sName == proName) {
    //       targetIndex = i;
    //       break;
    //     }
    //   }
    //   return targetIndex;
    // }


  </script>
</head>

<body>

</body>

</html>